package com.it.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * @Author: CaoYouGen
 * @DateTime: 2023/11/13/12:03
 * @注释: 用于生成和解析JWT
 **/
public class UtilJWT {
    
    // 声明一个密钥
    private static final String SECRET = "Coke_Anne";

    /*
     * TODO
     * 
     * @param userId: 用户编号
     * @param userName: 用户名
     * @param auth: 用户权限  
     * @return String
     * @author: CaoYouGen
     * @DateTime: 2023/11/13 12:06
     */
    public static String createToken(Integer userId, String userName, List<String> auth){
        // 得到当前的系统时间
        Date currentDate = new Date();
        // 根据当前时间计算出过期时间 定死为5分钟
        Date expTime = new Date(currentDate.getTime() + (1000 * 60 * 5));
        // 组装头数据
        HashMap<String, Object> header = new HashMap<>();
        header.put("alg","HS256");
        header.put("typ","JWT");
        return JWT.create()
                .withHeader(header) // 头
                .withIssuedAt(currentDate) // 创建时间
                .withExpiresAt(expTime) // 过期时间
                .withClaim("userId",userId) // 自定义数据
                .withClaim("userName",userName) // 自定义数据
                .withClaim("auth",auth) // 自定义数据
                .sign(Algorithm.HMAC256(SECRET));
    }
    
    public static Boolean verifyToken(String token){
        try {
            // 使用密码创建一个解析对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            // 验证 JWT
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            return true;
        }catch (TokenExpiredException e){
            e.printStackTrace();
        }
        return false;
    }
    
    /*
     * 获取JWT里面相前的用户编号
     * 
     * @param token:  
     * @return Integer
     * @author: CaoYouGen
     * @DateTime: 2023/11/13 12:19
     */
    public static Integer getIUserId(String token){
        try {
            // 使用密码创建一个解析对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            // 验证 JWT
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            Claim userId = decodedJWT.getClaim("userId");
            return userId.asInt();
        }catch (TokenExpiredException e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取JWT里面相前的用户名
     */
    public static String getUsername(String token){
        try{
            // 使用秘钥创建一个解析对象
            JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(SECRET)).build();
            //验证JWT
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            Claim username = decodedJWT.getClaim("userName");
            return username.asString();
        }catch (TokenExpiredException e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取JWT里面相前权限
     */
    public static List<String> getAuth(String token){
        try{
            // 使用秘钥创建一个解析对象
            JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(SECRET)).build();
            //验证JWT
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            Claim auth = decodedJWT.getClaim("auth");
            return auth.asList(String.class);
        }catch (TokenExpiredException e){
            e.printStackTrace();
        }
        return null;
    }



}
